﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Explore
{
    class ListViewSort : IComparer
    {
        /// <summary>
		/// Specifies the column to be sorted
		/// </summary>
		public int ColumnToSort;
		/// <summary>
		/// Specifies the order in which to sort (i.e. 'Ascending').
		/// </summary>
		public SortOrder OrderOfSort;
		/// <summary>
		/// Case insensitive comparer object
		/// </summary>
		
		private NumberCaseInsensitiveComparer ObjectCompare;


		/// <summary>
		/// Class constructor.  Initializes various elements
		/// </summary>
        public ListViewSort()
		{
			ColumnToSort = 0;

			// Initialize the CaseInsensitiveComparer object
			ObjectCompare = new NumberCaseInsensitiveComparer();
		}
        public int Compare(object x, object y)
		{
			int compareResult = 0;
			ListViewItem listviewX, listviewY;

			// Cast the objects to be compared to ListViewItem objects
			listviewX = (ListViewItem)x;
			listviewY = (ListViewItem)y;

            ListView listViewMain = listviewX.ListView;

            // Calculate correct return value based on object comparison
            if (listViewMain.Sorting != SortOrder.Ascending &&
                listViewMain.Sorting != SortOrder.Descending)
            {
                // Return '0' to indicate they are equal
                return compareResult;
            }


            // Compare the two items

            if (listviewX.SubItems.Count <= ColumnToSort &&
                listviewY.SubItems.Count <= ColumnToSort)
            {
                compareResult = ObjectCompare.Compare(null, null);
            }
            else if (listviewX.SubItems.Count <= ColumnToSort &&
                     listviewY.SubItems.Count > ColumnToSort)
            {
                compareResult = ObjectCompare.Compare(null, listviewY.SubItems[ColumnToSort].Text.Trim());
            }
            else if (listviewX.SubItems.Count > ColumnToSort && listviewY.SubItems.Count <= ColumnToSort)
            {
                compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text.Trim(), null);
            }
            else
            {
                compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text.Trim(), listviewY.SubItems[ColumnToSort].Text.Trim());
            }
            
            //caution

            // Calculate correct return value based on object comparison
            if (OrderOfSort == SortOrder.Ascending)
            {
                // Ascending sort is selected, return normal result of compare operation
                return compareResult;
            }
            else if (OrderOfSort == SortOrder.Descending)
            {
                // Descending sort is selected, return negative result of compare operation
                return (-compareResult);
            }
            else
            {
                // Return '0' to indicate they are equal
                return 0;
            }
        }
    
	}



	public class NumberCaseInsensitiveComparer : CaseInsensitiveComparer
	{
		public NumberCaseInsensitiveComparer ()
		{
			
		}

		public new int Compare(object x, object y)
		{
            if (x == null && y == null)
            {
                return 0;
            }
            else if (x == null && y != null)
            {
                return -1;
            }
            else if (x != null && y == null)
            {
                return 1;
            }
			if ((x is System.String) && IsWholeNumber((string)x) && (y is System.String) && IsWholeNumber((string)y))
			{
                try
                {
                    return base.Compare(Convert.ToUInt64(((string)x).Trim()), Convert.ToUInt64(((string)y).Trim()));
                }
                catch
                {
                    return -1;
                }
            }
			else
			{
				return base.Compare(x,y);
			}
		}

		private bool IsWholeNumber(string strNumber)
		{
            Regex wholePattern = new Regex(@"^\d+$");
            return wholePattern.IsMatch(strNumber);
		}  
    }
}
